Repository navigation
docs(diagrams): add Archify SVG exporter with 4.5:1 contrast check - #1498
Merged
Merged
Conversation
docs/diagrams/export-svg.mjs turns an Archify HTML diagram into a static, self-contained light or dark SVG using the ProjectA design tokens. Its `contrast` mode measures the WCAG ratio of every text colour against what is really painted behind it and exits 1 when any pair is below 4.5:1. The test drives contrast mode on one-line SVG fixtures: the WCAG reference pair #999999 on #FFFFFF (2.85:1) must exit 1, ink on ground (15.09:1) must exit 0. It skips with a reason when no Chromium is available. Authored by the UI designer; committed by the server job. Test-First: docs/diagrams/export-svg.test.mjs::contrast fails text below 4.5:1 with exit 1 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
| return new XMLSerializer().serializeToString(clone); | ||
| }, [T, FONT_SANS, FONT_MONO, title, desc]); | ||
| await browser.close(); | ||
| const out = svg.replace(/<!--[\s\S]*?-->/g, '').replace(/>\s+</g, '><'); |
Review of PR #1498 at 5d3eed8 (google/gemini-3.8-flash) found five defects in docs/diagrams/export-svg.mjs and its test: - R1498-G1: page.goto built the URL as 'file://' + path, which breaks on a '#', '%' or space in the path (and on Windows drive paths). It now uses pathToFileURL(...).href. - R1498-G2: playwright-core was resolved against the current directory (createRequire(resolve('package.json'))); outside the repository the script died with "Cannot find module". It now resolves against the script itself (import.meta.url), in the script and in the test. - R1498-G3: the browser stayed open when goto/evaluate threw; export and contrast now close it in a finally block. - R1498-G4: the test's Chromium probe ignored ARCHIFY_NO_SANDBOX, so it skipped where the script itself would run; it now uses the same launch arguments. - R1498-G7: the tests left their mkdtemp directories behind; they are removed after each run. Not fixed here (follow-up): G5 (export-mode assertions on a real fixture) and G6 (the '>\s+<' whitespace regex). The two new tests ran red against the previous script: the module was not found from a foreign working directory, and Chromium answered ERR_FILE_NOT_FOUND for a path containing '#'. The try/finally edits re-indent the browser blocks; `git diff -w` shows the real change. Test-First: docs/diagrams/export-svg.test.mjs::contrast finds playwright-core from a working directory outside the repository Test-First: docs/diagrams/export-svg.test.mjs::export opens an HTML file whose path needs URL escaping No-Test: R1498-G3, G4 and G7 are not observable on Linux: a leaked browser dies with its parent process, the sandbox-less probe needs a host without a usable sandbox, and a leftover temp directory is not asserted Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Cuarroc
marked this pull request as ready for review
October 15, 2026 04:53
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This was referenced Oct 15, 2026
Merged
Owner
Author
|
review-ok bound to head |
30 of 46 tasks
Contributor
Merge Queue Status
This pull request spent 11 minutes 16 seconds in the queue, including 11 minutes running CI. Required conditions to merge
|
This was referenced Oct 15, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Dieses Paket legt das Werkzeug
docs/diagrams/export-svg.mjsins Repo: Es macht aus einem Archify-Diagramm ein festes, helles oder dunkles SVG und misst im Moduscontrastjede Textfarbe gegen den wirklich gemalten Hintergrund. Sobald irgendein Text unter dem Verhältnis 4,5:1 liegt, endet der Modus mit Fehlercode 1, damit schlecht lesbare Diagramme auffallen, bevor sie ins Fabrik-Designsystem wandern. Du musst nichts entscheiden; die fünf angenommenen Befunde der ersten Prüfrunde sind behoben, und der PR bleibt ein Entwurf, bis ein Prüfer außerhalb der Anthropic-Familie (Stufe B) auch die Änderungen daran gesehen hat.Report
Package: FABRIK-DS-1 PR A (Fabrik Stufe 1, Diagrammquellen; Ziel G-V2) · Review tier: B
Autor: UI-Designer (Claude Opus), committed by server job
Goal / benefit:
export-svg.mjsundexport-svg.test.mjsliegen unterdocs/diagrams/; der Exporter erzeugt statische Light/Dark-SVGs und prüft Kontrast. · Parent / owner: G-V2 Punkt 3/7, Root als Chief (Auftrag 15.10.2026)Scope / limits: nur diese zwei Dateien, kein README, kein App-Code, keine Seam. 236 Diff-Zeilen gegen die Merge-Base (Limit 300; 199 vor der Nachbesserung).
What changed
docs/diagrams/export-svg.mjs(156 Zeilen): Modusexport <in.html> <out.svg> <light|dark> "<title>" "<desc>"tauscht die Archify-Palette gegen die ProjectA-Tokens, inlined alle berechneten Farben, entfernt die Viewer-Schicht und beschneidet auf die Zeichnung. Moduscontrast <file.svg>...gibt je Farbpaar das WCAG-Verhältnis aus und setztprocess.exitCode = 1, wenn das Minimum unter 4,5 liegt. Chromium kommt ausARCHIFY_CHROME, sonst aus Playwright.docs/diagrams/export-svg.test.mjs(43 Zeilen): zwei Tests auf einzeiligen SVG-Fixtures.#999999auf#FFFFFF(2,85:1) muss Exit 1 liefern,#121826auf#E9EDF3(15,09:1) Exit 0. Ohne Chromium überspringen sich die Tests mit Begründung.5d3eed8f): beide Dateien byte-identisch zur Vorlage des UI-Designers (cmpExit 0). Nachbesserung (0665ec44): die fünf angenommenen Befunde der Prüfrunde 1 (Tabelle unten); die Logik des Exports ist unverändert, nur Start, Pfadbildung und Aufräumen. Dietry/finally-Blöcke rücken zwei Browser-Blöcke ein;git diff -wzeigt die eigentliche Änderung.playwright-corewird aus dem vorhandenennode_modulesaufgelöst (kommt über@playwright/test, steht nicht direkt inpackage.json).Evidence
npm run dev:start-check(RAM 10,7 GB frei, 1 fremder Cargo-Build)node --test docs/diagrams/export-svg.test.mjs(lief, 2 von 2 bestanden, 0 übersprungen, Chromium aus Playwright-Cache)min < 4.5→min < 2, dann derselbe Test: Test 1 rot (0 !== 1), Test 2 grüncmpgegen Vorlage; Test erneutbash scripts/ci/red-first.sh(Merge-Base: Datei fehlt → rot/fehlend, Kopf:✔ contrast fails text below 4.5:1 with exit 1)git diff --check origin/main HEADbash scripts/ci/gates.sh lane prepush(26 Gates grün, 453 s, ungepiped, HEAD5d3eed8f)git push -u origin claude/fabrik-ds-1a-export-svg(Pre-Push-Hook führt die Prepush-Bahn erneut aus)git ls-remote origin claude/fabrik-ds-1a-export-svg=5d3eed8f22ca818b38e997deb1821d783cf880d0= lokaler HEADArchitecture drift:
architecture-driftgrün, nichts gemeldet, nichts auf die Allowlist gesetzt.NICHT ABGEDECKT
architektur-light/-darkZuschnitt und Badge-x um ≤ 4 px bzw. ≤ 0,07 px); das betrifft nur den Modusexport.exportist nur dünn getestet. Der neue Test R1498-G1 lässtexportauf einem winzigen Fixture mit#/%/Leerzeichen im Pfad laufen und prüft nur Exit 0 und den Text im SVG; Palette, Viewer-Schicht und Zuschnitt prüft nichts (Nachfolger R1498-G5). Die echte Ausgabe liegt erst mit den Diagramm-PRs B–F vor.docs/diagrams/*.test.mjsaus. Wedernpm testnoch die Prepush-Bahn kennen den Pfad; bewiesen wird der Test nur über dasTest-First-Trailer-Gatered-first. Der zweite Test (contrast passes ink on ground with exit 0) hat keinen Trailer und läuft deshalb in keinem Gate; ihn zu verdrahten wäre ein eigenes Paket. Die beiden neuen Tests der Nachbesserung tragen Trailer.gates (linux)ihn ebenfalls ausführt und nicht überspringt, folgt aus.github/actions/setup-linux(installiert Chromium standardmäßig), ist aber in einem CI-Lauf noch nicht beobachtet. Ein Überspringen würdered-firstrot machen (fail-closed, keine✔-Zeile), nicht still grün.Reviews and disposition
Runde 1: google/gemini-3.8-flash @5d3eed8f (Stufe B); Annahme durch Root am 15.10.2026. Review der Nachbesserung (Delta
5d3eed8f..0665ec44): ausstehend (Stufe B), beauftragt durch Root.Review disposition (round 1)
export-svg.mjs:48baut die URL als'file://' + resolve(inHtml); ein#,%, Leerzeichen oder Windows-Laufwerk im Pfad ergibt eine falsche URL.pathToFileURL(resolve(inHtml)).href; keine weiterefile://-Verkettung in beiden Dateien (grep). Testexport opens an HTML file whose path needs URL escaping: rot (ERR_FILE_NOT_FOUND), jetzt grün. Auch auf Linux testbar (#im Pfad), nicht nur unter Windows.export-svg.mjs:17undexport-svg.test.mjs:17lösenplaywright-coreübercreateRequire(resolve('package.json'))auf, also je nach Arbeitsverzeichnis.createRequire(import.meta.url)in beiden Dateien. Testcontrast finds playwright-core from a working directory outside the repository: rot (Cannot find module 'playwright-core'), jetzt grün. Abweichung vom Auftrag: mit Arbeitsverzeichnisdocs/diagramswar der alte Code bereits grün (Node suchtnode_modulesaufwärts), rot wird er erst außerhalb des Repos; der Test nutzt deshalb das Temp-Verzeichnis.:46,:124) wird nicht geschlossen, wenngoto/setContent/evaluatewirft.try/finallymitawait browser.close()inexportSvgundcontrast. Kein Test: ein ausgelaufener Browser stirbt mit seinem Elternprozess, das ist von außen nicht beobachtbar.chromiumMissing()(export-svg.test.mjs:18) startet ohne das--no-sandboxausARCHIFY_NO_SANDBOX, überspringt also dort, wo das Skript liefe.argswielaunch(). Kein Test: braucht einen Rechner ohne nutzbare Sandbox.exportmit Fixture.>\s+<(export-svg.mjs, Zeileout = svg.replace(...)) entfernt auch bedeutsame Leerräume.mkdtempSync-Verzeichnisse des Tests (:28) werden nie gelöscht.rmSync(dir, { recursive: true, force: true })imfinally(HilfsfunktioninScratch). Kein Test: ein übrig gebliebenes Temp-Verzeichnis wird nicht geprüft.Test-First (plain text, for the red-first gate):
Test-First: docs/diagrams/export-svg.test.mjs::contrast finds playwright-core from a working directory outside the repository
Test-First: docs/diagrams/export-svg.test.mjs::export opens an HTML file whose path needs URL escaping
No-Test: R1498-G3, G4 and G7 are not observable on Linux (see table)
Größe: 236 Diff-Zeilen gegen die Merge-Base (164 + 72), unter dem Limit von 300; keine Überschreitung durch die Prüfrunde.
Evidence (Nachbesserung, HEAD
0665ec44)npm run dev:start-check(RAM 12,7 GB frei, 0 Cargo-Builds)5d3eed8f): 2 von 4 rot (Cannot find module 'playwright-core',page.goto: net::ERR_FILE_NOT_FOUND),contrast-Tests 1 und 2 grünnode --test docs/diagrams/export-svg.test.mjsam Kopf (lief, 4 von 4 bestanden, 0 übersprungen, Chromium aus dem Playwright-Cache)bash scripts/ci/red-first.sh(alle drei Trailer: an der Merge-Base rot/fehlend, am Kopf grün)git diff --checkbash scripts/ci/gates.sh lane prepush(26 Gates grün, 267 s, ungepiped, HEAD0665ec44)git push -u origin claude/fabrik-ds-1a-export-svg(Pre-Push-Hook führt die Prepush-Bahn erneut aus; ohne Force)git ls-remote origin claude/fabrik-ds-1a-export-svg=0665ec447808950d49b7c79cb317301bf54cb53e= lokaler HEADHinweis zum Belegwert von
red-first: Die Datei existiert an der Merge-Base nicht, das Gate sieht jeden Test dort als „fehlend“. Dass die zwei neuen Tests gegen den alten Code rot sind, belegt der Lauf in Zeile 2.Open points
0665ec44(vorher5d3eed8f) auf Basisb9dfad49; Entwurf; Root beauftragt das Review und setzt späterreview-ok. Folgepakete B–F (Diagramme, README) liegen indocs/diagrams/unddocs/design/2026-10-fabrik/.🤖 Generated with Claude Code
Review round 2 (Root)
Delta
5d3eed8f..0665ec44reviewed by google/gemini-3.8-flash (Google, author family Anthropic): APPROVE, no new findings. PR size after the review-forced fix round: +236 (under 300). Follow-ups: R1498-G5, R1498-G6, and wiringdocs/diagrams/*.test.mjsinto a gate lane.